---
slug: 数据清洗 #路径，不能重复
title: 数据清洗 # 标题
authors: [] # 作者，在authors.yml配置
tags: [facebook, hello, docusaurus] # 标签，在tags.yml配置
toc_min_heading_level: 2 # 最小展示标题
toc_max_heading_level: 5 # 最大展示标题
---

# 数据清洗

## 思路
### `user`表,`dept`,`org`


关联键:
* `use-id`
* `dept-user_id`
* `org-u_id`
---
#### 只是比关联键对的上的数据

> `user`表和`dept`表关联键对的上则比`user`和`dept`的,就和`org`没关系了

#### 第一种情况就是三个表的差异数据全都有:
> 差异字段: `user-name=张三` ; `dept-user_name=李四`,`org-u_name=王五`


**肯定是差异**

那生成的宽表就是

| id | 关联键  | name            |
|----|------|-----------------|
| 1  | 1245 | 张三(这时候张三就是随便取得) |


###### 处理的时候

假设选中了`dept-user_name`表的李四为最终数据,则`user`,`org`表的`name`都要改成李四

那宽表就变成了


| id | 关联键| name|
|----|----|----|
| 1  | 1245 | 李四|

---

#### 第二张情况是有一个表的差异数据没值但是差异数据不为空的表数>1
> 差异字段是`user-code=2`,`dept-user_code=3`,`org-u_code`无值

**则`user`表和`dept`表形成差异,org表没值就是没值，不差异**

那生成的宽表就是

| id | 关联键 | code             |
|----|-----|------------------|
| 1  | 123 | 2(user/dept表随意取) |

###### 处理的时候

| 关联键 | user表code | dept表user_code | org表u_code |
|-----|-----------|----------------|------------|
| 1   | 2         | 3              | -          |

能选择的就是`user-code=2`/ `dept-user_code=3`

假设选择了`dept`表

则
```mysql

-- user表

update user set code = 3 where id = 123;

-- dept表不动，因为选择的是他

-- org表不动,因为不填就是对的

```

则生成的宽表是

| id | 关联键 | code |
|----|-----|------|
| 1  | 123 | 3    |

#### 最后一种情况就是差异数据有值的表=1

> `use-card=210282`,`dept-user_card`无值,`org表u_card`无值

**这时候满足唯一性,即user表的card就是正确的,这一条card数据不构成差异**

则生成的宽表就是

| id | 关联键 | card   |
|----|-----|--------|
| 1  | 123 | 210282 |


#### 宽表

1. 第一次在任务执行时候我就得去`org`,`dept`,`user`三张表找到**所有**的关联键值,然后`distinct`去重一下
把这些关联键作为宽表的x轴
2. 在处理时候对于宽表的数据是`update`
3. 再一次执行任务是在宽表已有数据的基础上`insert`

